package com.woniuxy.util;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.stereotype.Component;

import java.lang.reflect.InvocationTargetException;
import java.util.List;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collectors;

/**
 * @BelongsProject: charging-management-platform
 * @BelongsPackage: com.woniuxy.util
 * @Author: Quan
 * @Date: 2025/3/28 12:01
 */
@Component
public class PageHelperUtil {
	/**
	 * 基础分页查询
	 * @param pageParam 分页参数
	 * @param queryFunction 查询函数（无参数）
	 * @return 分页结果
	 */
	public  <T, R> PageInfo<R> getPageInfo(PageParam<T> pageParam, Function<T, List<R>> queryFunction) {
		PageHelper.startPage(pageParam.getPageNum(), pageParam.getPageSize());
		List<R> result = queryFunction.apply(pageParam.getParam());
		return new PageInfo<>(result);
	}

	/**
	 * 带数据转换的分页查询
	 * @param pageParam 分页参数
	 * @param queryFunction 查询函数（无参数）
	 * @param convertFunction 数据转换函数
	 * @return 分页结果
	 *
	 * 示例：
	 * PageInfo<UserDTO> pageInfo = getPageInfo(
	 *     pageParam,
	 *     () -> userMapper.selectAll(),
	 *     user -> new UserDTO(user.getId(), user.getName())
	 * );
	 */
	public  <T, U, R> PageInfo<R> getPageInfo(PageParam<T> pageParam,
													Function<T, List<U>> queryFunction,
													Function<U, R> convertFunction) {
		PageHelper.startPage(pageParam.getPageNum(), pageParam.getPageSize());
		List<U> tempList = queryFunction.apply(pageParam.getParam());

		// 获取原始分页对象
		Page<U> page = (Page<U>) tempList;

		// 转换数据
		List<R> result = page.getResult().stream()
				.map(convertFunction)
				.collect(Collectors.toList());

		// 构造新的 PageInfo，保留原始分页信息
		PageInfo<R> pageInfo = new PageInfo<>(result);
		pageInfo.setTotal(page.getTotal());
		return pageInfo;
	}

	/**
	 * 不带参数的
	 */
	// 新增方法（无参数）
	public  <R> PageInfo<R> getPageInfo(PageParam<?> pageParam, Supplier<List<R>> queryFunction) {
		PageHelper.startPage(pageParam.getPageNum(), pageParam.getPageSize());
		List<R> result = queryFunction.get(); // 不需要参数
		return new PageInfo<>(result);
	}

	public  <T, R> PageInfo<R> getPageInfo(PageParam<?> pageParam,
												 Supplier<List<T>> queryFunction,
												 Function<T, R> convertFunction) {
		PageHelper.startPage(pageParam.getPageNum(), pageParam.getPageSize());
		List<T> tempList = queryFunction.get();

		// 获取原始分页对象
		Page<T> page = (Page<T>) tempList;

		// 转换数据
		List<R> result = page.getResult().stream()
				.map(convertFunction)
				.collect(Collectors.toList());

		// 构造新的 PageInfo，保留原始分页信息
		PageInfo<R> pageInfo = new PageInfo<>(result);
		pageInfo.setTotal(page.getTotal());
		return pageInfo;
	}
}
